IEEE 754: chuẩn dấu phẩy động trong máy tính ngày nay Số_thực_dấu_phẩy_động

Bài chi tiết: IEEE 754-2008

Hiệp hội IEEE đã chuẩn hóa cho việc biểu diễn số dấu phẩy động nhị phân trong máy tính bằng cách đưa ra chuẩn IEEE 754. Ngày nay hầu hết các máy tính đều tuân thủ theo chuẩn này. Một số trường hợp ngoại lệ như máy tính lớn IBM và máy vector Cray. Loại máy tính lớn IBM ngoài định dạng thập phân và nhị phân IEEE 754 còn có một định dạng riêng của IBM. Còn với máy vector Cray thì họ T90 có một phiên bản IEEE nhưng máy SV1 vẫn còn dùng định dạng dấu phẩy động của chính Cray.

Chuẩn IEEE 754 đưa ra nhiều định dạng rất gần nhau, chỉ khác nhau ở một ít chi tiết. Năm trong số những định dạng này được gọi là định dạng cơ bản, và hai trong chúng đặc biệt được dùng rộng rãi trong cả phần cứng máy tính và ngôn ngữ lập trình:

  • Độ chính xác đơn, được gọi bằng tên là "float" trong họ ngôn ngữ lập trình C và tên là "real" hay "real*4" trong ngôn ngữ Fortran. Đây là định dạng nhị phân chiếm 32 bit (4 byte) và phần định trị của nó có độ chính xác 24 bit (tương đương với khoảng 7 chữ số thập phân).
  • Độ chính xác kép, được gọi bằng tên là "double" trong họ ngôn ngữ lập trình C và tên là "double precision" hay "real*8" trong ngôn ngữ Fortran. Đây là định dạng nhị phân chiếm 64 bit (8 byte) và phần định trị của nó có độ chính xác 53 bit (tương đương với khoảng 16 chữ số thập phân).

Các định dạng khác là nhị phân với độ chính xác bậc bốn (128 bit), cũng như là dấu phẩy động thập phân (64 bit) và dấu phẩy động thập phân "kép" (128 bit).

Các định dạng ít thông dụng hơn:

Bất kỳ một số nguyên nào có giá trị tuyệt đối nhỏ hơn hay bằng 224 đều có thể biểu diễn một cách chính xác bằng định dạng độ chính xác đơn, và bất kỳ số nguyên nào có giá trị tuyệt đối nhỏ hơn hay bằng 253 cũng có thể biểu diễn một cách chính xác bằng định dạng độ chính xác kép.

Mặc dầu các định dạng 32 bit ("đơn") và 64 bit ("kép") hiện nay là phổ biến, nhưng chuẩn IEEE 754 cũng cho phép nhiều mức chính xác khác nhau. Lấy ví dụ, các phần cứng máy tính như họ Pentium Intel và họ 68000 Motorola thường có thêm định dạng độ chính xác mở rộng 80 bit, với phần mũ 15 bit, phần định trị 64 bit (không có bit ẩn) và 1 bit dấu.Một dự án nhằm mục đích sửa đổi chuẩn IEEE 754 đã được khởi động trong năm 2000 (xem IEEE 754 sửa đổi. Dự án này đã hoàn thành và được công nhận vào tháng 6 năm 2008. Nó bao gồm các định dạng dấu phẩy động thập phân và định dạng dấu phẩy động 16 bit ("nữa"). Định dạng 16 bit nhị phân có cùng cấu trúc và quy luật như các định dạng cũ khác với 1 bit dấu, phần mũ 5 bit và 10 bit phần định trị. Định dạng này hiện đang được sử dụng trong ngôn ngữ đồ họa Cg của NVIDIA, và có mặt trong chuẩn mở EXR.[2]

Cấu trúc biểu diễn bên trong máy tính

Thông thường thì các số dấu phẩy động được thể hiện trong bộ nhớ máy tính theo thứ tự từ trái sang phải gồm bit dấu, phần mũ, rồi đến phần định trị. Với định dạng nhị phân IEEE 754 chúng thường được biểu diễn bằng các phần sau:

KiểuDấuPhần mũPhần định trịTổng số bitPhân cực mũĐộ chính xác
Nửa1510161511
Đơn18233212724
Kép1115264102353
Bậc bốn11511212816383113

Cần lưu ý rằng phần mũ có giá trị âm hay dương, nhưng khi lưu trữ trong máy tính người ta không dùng hệ bù 2 để biểu diễn phần mũ mà lại sử dụng một phương pháp khác: biểu diễn phần mũ dưới dạng một số không dấu nhưng có một giá trị "phân cực" cố định thêm vào. Lấy ví dụ, với định dạng độ chính xác đơn thì giá trị phân cực bằng +127, có nghĩa là để biểu diễn giá trị phần mũ bằng 0 thì người ta lưu trong máy tính các bit là 01111111 tức là +127. Tương tự, ở độ chính xác đơn, giá trị phần mũ là 11111110 (+254) thì giá trị thực phải hiểu là +127 (= 254 – 127). Mỗi định dạng bán chính xác, độ chính xác đơn, độ chính xác kép… đều có một giá trị phân cực riêng của nó…(xem bảng trên). Có hai trường hợp đặc biệt: nếu phần mũ có tất cả các bit bằng 0 thì nó được dùng để biểu diễn các số zero và số không chuẩn hóa, nếu phần mũ có tất cả các bit bằng 1 thì nó được dùng để biểu diễn các vô cực và NaN. Như vậy, giá trị phần mũ của các số chuẩn hóa có tầm nằm trong [-14, 15] ở độ chính xác nữa, [-126, 127] ở độ chính xác đơn, [-1022, 1023] ở độ chính xác kép, hay [-16382, 16383] với độ chính xác bậc bốn. Khi ta nói đến số chuẩn hóa là ta đã loại trừ không xét các số zero, vô cực, NaN và các số không chuẩn hóa.

Cũng cần nhớ rằng, phần định trị trong định dạng nhị phân của IEEE luôn có một bit 1 đầu tiên không được lưu trữ trong máy tính. Nó được gọi là bit "ẩn" hay bit "hiểu ngầm". Chính vì thế, tuy trong máy tính, định dạng độ chính xác đơn có phần định trị gồm 23 bit nhưng ta phải hiểu nó có độ chính xác lên đến 24 bit. Tương tự như vậy, định dạng độ chính xác kép có độ chính xác 53 bit và độ chính xác bậc bốn là 113.Lấy ví dụ, như ta đã chỉ ra ở phần trên, số π, làm tròn đến độ chính xác 24 bit, có:

  • dấu = 0; phần mũ e = 1; phần định trị s = 110010010000111111011011 (bao gồm cả bit ẩn)

Tổng của giá trị phân cực cho phần mũ (127) và giá trị phần mũ (1) là 128 nên chuỗi 8 bit cần lưu trong máy tính của phần mũ phải là: 10000000Cuối cùng, toàn bộ giá trị của số π được lưu ở định dạng độ chính xác đơn là0 10000000 10010010000111111011011 (đã bỏ bit ẩn) = 40490FDB (cơ số 16)

Các giá trị đặc biệt

Số không có dấu

Bài chi tiết: Số không có dấu

Trong chuẩn IEEE 754, số không có dấu, nghĩa là có đến hai số không: số "không dương" (+0) và số "không âm" (-0). Trong hầu hết các môi trường thực thi, số không dương thường được xuất hiện là "0", trong khi số không âm có thể được in là "-0". Hai giá trị này được xem là bằng nhau về mặt giá trị nhưng một vài phép toán sẽ thông báo kết quả phân biệt giữa +0 và -0. Lấy ví dụ, a/(-0) sẽ cho ra kết quả là vô cực âm còn a/(+0) sẽ cho kết quả là vô cực dương với a là một số dương. Trường hợp a là số âm thì kết quả ngược lại. Tuy nhiên, hai phép toán này khi thông báo kết quả cũng kèm theo thông báo trường hợp ngoại lệ "chia cho số không". Một phép toán arrcot có tính đối xứng dấu chẳng hạn sẽ cho các kết quả khác nhau cho hai trường hợp +0 và -0 mà không có bất kỳ thông báo ngoại lệ nào hết. Sự khác biệt giữa +0 và -0 dễ nhận thấy trong các phép toán phức tạp tại cái gọi là lát cắt rẽ nhánh.

Bài viết này không được chú giải bất kỳ nguồn tham khảo nào. Mời bạn giúp cải thiện bài viết này bằng cách bổ sung chú thích cho từng nội dung cụ thể trong bài viết tới các nguồn đáng tin cậy. Các nội dung không có nguồn có thể bị nghi ngờ và xóa bỏ.

1. Mô tả chung

Số thực dấu phẩy động được dùng để biểu diễn các số thực trong tính toán khoa học. Tổng quát một số thực X được biểu diễn theo kiểu số dấu phẩy động như sau:X = M*RE.

Trong đó:

  • M là phần định trị (Mantissa)
  • R là cơ số (Radix)
  • E là phần mũ (Exponent)

2. Chuẩn IEEE754/85

  • Cơ số R = 2
  • Các dạng 32, 44, 64, 80 bit

Ví dụ dạng 32 bit

1 bit8 bit23 bit
Sem
  • S là bít dấu (số dương S = 0)
  • e là mã excess của phần mũ E (e = E+127 hay E = e-127, số 127 ở đây là độ lệch bias)
  • m là phần lẽ của phần định trị M (M = 1.m)

Do vậy công thức xác định giá trị số thực như sau:X = (-1)S * 1.m * 2e-127

3. Ví dụ số thực dấu phẩy động 32 bit theo chuẩn IEEE754/85

11000001010101100000000000000000
  • S = 1 -> Số âm (S là 1 bit đầu tiên).
  • e = 1000 00102 = 13010 -> E = 130 - 127 = 3 (e là 8 bit tiếp theo).
  • m = 101011 -> M = 1.101011 (m là 23 bit còn lại, ở đây không cần quan tâm đến các bit 0 ở cuối vì khi ghép M = 1.m thì các số 0 này không cần viết vào)

X = -1.101011 * 23 = -1101.011 = -13.375